// underscore mixins
// 支持：
// _([1, 2, 3]).each((item, index) => console.log(item, index))
// _.each([1,2,3], (item, index) => console.log(item, index))

/**
 * 无 new 构造
 * @param {Obejct} obj 
 */
var _ = function(obj) {
  if (obj instanceof _) return obj
  if (!(this instanceof _)) return new _(obj)
  // 参数保存在 _wrapped
  this._wrapped = obj
}

_.mixin = function(obj) {
  Object.keys(obj).forEach(name => {
    // 直接调用 _.you(args)
    var func = (_[name] = obj[name])
    // 挂在原型 _(args).you()
    _.prototype[name] = function() {
      var args = [this._wrapped]
      Array.prototype.push.apply(args, arguments)
      return func.apply(_, args)
    }
  })
}

_.mixin({
  each: function(array, func) {
    for (let index = 0; index < array.length; index++) {
      const element = array[index];
      func.call(this, element, index)
    }
  },

  cpa: function(num, index) {
    console.log(num, index)
  },
})

_([1, 2, 3]).each(_.cpa)
_.each([1,2,3], _.cpa)
